package core;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

import utility.ParsedCono;

public class Doctor {
	private ArrayList<Cono> coni;
	
	public Doctor(){
		coni = new ArrayList<Cono>();
	}
	
	/**
	 * Per ogni uscita KO, prende l'intersezione con tutti i coni delle uscite OK e se l'insieme � vuoto allora setta come invalid 
	 * tutti i nodi del cono con uscita OK.
	 */
	public void invalidOKnodes(){
	//System.out.println("Invalidando i nodi appartenenti a coni totalmente KO");
	
	for(int i=0; i<this.coni.size(); i++){
		Cono conoOK= coni.get(i);
		//System.out.println("----------------------"+conoOK.getRoot().getId()+"----------------------");
		Set<Node> totalIntersect=new HashSet<Node>();
		if(conoOK.getMarcatura().equalsIgnoreCase("OK")){
			for(int j=0; j<this.coni.size(); j++){
				
				Cono conoKO= coni.get(j);
				
				// i � OK e j � KO
				//System.out.println("\nConfrontando "+conoOK.getRoot().getId()+","+conoOK.getMarcatura()+" e "+conoKO.getRoot().getId()+","+conoKO.getMarcatura());
				//System.out.println(conoKO.getMarcatura().equalsIgnoreCase("KO"));
				// se la coppia analizzata � OK-KO o KO-OK fanne l'intersezione.
				if(conoKO.getMarcatura().equalsIgnoreCase("KO")){
					Set<Node> intersect = this.intersection(conoOK.getCono(), conoKO.getCono());
					totalIntersect=union(totalIntersect,intersect);
					
					//System.out.println("L'intersezione tra il cono OK di "+conoOK.getRoot().getId()+" e quello OK di "+conoKO.getRoot().getId()+ " ha dimensione "+intersect.size()+" ora totIntersect ha dim "+totalIntersect.size());
					for(Node k: intersect){
						//System.out.println(k.getId());				
						}
					}else{
					//System.out.println("Niente da fare qua sono entrambe OK");
				}
			}
			if(totalIntersect.size()==0){ // se l'intersezione � nulla..
	
				//System.out.println("L'intersezione � nulla setto o nodi eliminare tutti i nodi di "+conoOK.getRoot().getId());
				setAllInvalid(conoOK);
				
			}
		}else{
			//System.out.println("L'elemento "+conoOK.getRoot().getId()+" � "+conoOK.getMarcatura()+" non va valutato");
			
		}
	}

	}
	

	
	private void setAllInvalid(Cono cono){
		for(Node n : cono.getCono())
			n.setNotValid();
	}
	
	public Set<Node> union(Set<Node> s1,Set<Node> s2){
		Set <Node> s3=new HashSet<Node>(s1);
		s3.addAll(s2);
		return s3;
	}
	
	public Set<Node> intersection(Set<Node> s1,Set<Node> s2){
		Set <Node> s3=new HashSet<Node>(s1);
		s3.retainAll(s2);
		return s3;
	}
		
	public Set<Node> difference(Set<Node> s1,Set<Node> s2){
		Set <Node> s3=new HashSet<Node>(s1);
		s3.removeAll(s2);
		return s3;
	}

}
